;(function () {
  /* 
 除了我们上面提到的类型比较，其实还存在着一些比较情况，我们稍作补充。

对于基类和派生类，通常情况下派生类会完全保留基类的结构，而只是自己新增新的属性与方法。在结构化类型的比较下，其类型自然会存在子类型关系。更不用说派生类本身就是 extends 基类得到的。

联合类型的判断，前面我们只是判断联合类型的单个成员，那如果是多个成员呢？
 */
  type Result36 = 1 | 2 | 3 extends 1 | 2 | 3 | 4 ? 1 : 2 //1
  type Result37 = 2 | 4 extends 1 | 2 | 3 | 4 ? 1 : 2 // 1
  type Result38 = 1 | 2 | 5 extends 1 | 2 | 3 | 4 ? 1 : 2 // 2
  type Result39 = 1 | 5 extends 1 | 2 | 3 | 4 ? 1 : 2 // 2
  //对于联合类型地类型层级比较，我们只需要比较一个联合类型是否可被视为另一个联合类型的子集，即这个联合类型中所有成员在另一个联合类型中都能找到。

  // #数组和元组
  type Result40 = [number, number] extends number[] ? 1 : 2 //1
  type Result41 = [number, string] extends number[] ? 1 : 2 //2
  type Result42 = [number, string] extends (number | string)[] ? 1 : 2
  type Result43 = [] extends number[] ? 1 : 2 //1
  type Result44 = [] extends unknown[] ? 1 : 2 //1
  type Result45 = number[] extends (number | string)[] ? 1 : 2 //1
  type Result46 = any[] extends number[] ? 1 : 2 //1
  type Result47 = unknown[] extends number[] ? 1 : 2 // 2
  type Result48 = never[] extends number[] ? 1 : 2 // 1

  //48，类似于 43、44，由于 never 类型本就位于最下方，这里显然成立。只不过 never[] 类型的数组也就无法再填充值了。
})()
